package server

import (
	"fmt"
	"gin_http/internal/middleware"
	adminModel "gin_http/internal/model/admin"
	"gin_http/internal/router"
	repositorywire "gin_http/internal/wire/repository"
	"gin_http/utils/common"
	"gin_http/utils/config"
	"gin_http/utils/db"
	"gin_http/utils/logger"

	"github.com/gin-gonic/gin"
)

func InitApi(Api *gin.Engine) {

	conf := config.GetConfig()
	log := logger.GetLogger()
	log.Info("================================================")
	log.Info("正在初始化应用...")
	_ = db.GetDB()

	// 自动迁移模型
	_ = db.GetDB().AutoMigrate(&adminModel.User{}, &adminModel.Role{}, &adminModel.Permissions{}, &adminModel.UserRole{}, &adminModel.RolePermissions{})
	// 检测是否有初始用户，如果没有就创建一个初始用户
	InitInitialUser()

	// 初始化配置
	Api = gin.Default()
	// 初始化中间件
	Api.Use(middleware.GlobalErrorHandler())

	// 初始化路由
	log.Info("正在初始化路由...")
	router.InitApiRoute(Api)

	log.Info("正在启动API服务...")
	err := Api.Run(fmt.Sprintf(":%v", conf.Server.Port))
	if err != nil {
		return
	}
}

// InitInitialUser 函数用于初始化超级管理员用户角色
func InitInitialUser() {
	// 初始化超级管理员用户角色
	AdminRoleRepository, err := repositorywire.InitAdminRoleRepository()
	if err != nil {
		logger.GetLogger().Error("初始化管理员用户失败，初始化管理角色仓储层失败")
		return
	}
	result := AdminRoleRepository.DB.Where(adminModel.Role{Sign: "SUPER"}).FirstOrCreate(&adminModel.Role{Name: "超级管理员", Sign: "SUPER"})
	if result.Error != nil {
		logger.GetLogger().Error("初始化管理员用户失败，初始化管理角色失败")
		return
	}
	// 通过依赖注入初始化用户仓储
	AdminUserRepository, err := repositorywire.InitAdminUserRepository()
	if err != nil {
		logger.GetLogger().Error("初始化管理员用户失败，初始化管理用户仓储层失败")
		return
	}
	// 对密码进行加密
	password, err := common.PasswordEncrypt("admin")
	if err != nil {
		logger.GetLogger().Error("初始化管理员用户失败，密码加密错误")
		return
	}
	result = AdminUserRepository.DB.Where(adminModel.User{Username: "admin"}).FirstOrCreate(&adminModel.User{Username: "admin", Password: password, Nickname: "admin", Status: 1})
	if result.Error != nil {
		logger.GetLogger().Error("初始化管理员用户失败，初始化管理用户失败")
		return
	}
}
